package com.atguigu.recursion;

import com.sun.xml.internal.fastinfoset.tools.XML_SAX_StAX_FI;

import java.util.Arrays;

public class Queue8 {
    //定义一个max表示几个皇后
    int max=8;
    static int count=0;
    //定义数组array，保存皇后最后放的位置
    int[] arr=new int[8];
    public static void main(String[] args) {
        Queue8 queue8 = new Queue8();
        queue8.check(0);
        System.out.println(count);
    }
    //放置第n个皇后
    //进入一次之后，就会有一个for循环，因此会有回溯
    private void check(int n){
        if(n==max){//此时8个皇后放好了
            print();
            return;
        }
        //依次放入皇后，判断是否冲突
        for (int i = 0; i < max; i++) {
            //把该皇后放到该行的第一个位置
            arr[n]=i;
            //判断放到第i行的时候，是否冲突
            if(jude(n)){//不冲突
                //接着放第n+1
                check(n+1);
            }
            //如果冲突，继续执行arr[n]=i;本行的皇后后移动一个位置

        }

    }
    //查看我们放置第n个皇后，就去检测该皇后是否和之前摆放的皇后位置冲突
    private boolean jude(int n){
        for (int i = 0; i < n; i++) {
            //表示判断第n个皇后和前面的n-1个皇后是否在同一列和同一斜线
            if(arr[i]==arr[n]||Math.abs(n-i)==Math.abs(arr[n]-arr[i])){
                return false;
            }

        }
        return true;
    }



    //该方法输出皇后摆放的位置
    public  void print(){
        count++;
        String s = Arrays.toString(arr);
        System.out.println(s);
    }

}
